package com.bt7274.service;

import com.bt7274.enums.SortType;
import com.bt7274.pojo.Torrent;
import com.bt7274.pojo.bo.TorrentUploadBO;
import com.bt7274.pojo.vo.TorrentDetailVO;
import com.bt7274.pojo.vo.TorrentListVO;
import com.bt7274.utils.PagedGridResult;
import org.apache.mahout.cf.taste.common.TasteException;
import org.jetbrains.annotations.NotNull;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

public interface TorrentService {

    public Torrent createOrUpdate(@NotNull Torrent torrent);

    public Torrent getTorrentById(long id);

    public Torrent getTorrentByHash(@NotNull String infoHash);

    public PagedGridResult queryAllReviewed(int page, int pageSize);

    public PagedGridResult queryAllUnreviewed(int page, int pageSize);

    TorrentDetailVO getTorrentDetail(Long torrentId, String userId);

    /**
     * 根据类别 ID 获取对应类别的种子列表
     * @param categoryId 类别 ID
     * @return 对应类别的种子列表
     */
    public PagedGridResult getTorrentsByCategoryId(Long categoryId, int page, int pageSize);

    /**
     * 审核种子
     * @param infoHash 种子的 infoHash
     * @param isApproved 审核结果，0 表示不通过，1 表示通过
     * @return 审核操作是否成功
     */
    public boolean reviewTorrent(String infoHash, int isApproved);

    /**
     * 根据关键词在 tags 和 description 字段进行模糊搜索
     * @param keyword 搜索关键词
     * @return 匹配的种子列表
     */
    PagedGridResult searchTorrents(String keyword, SortType sortType, int page, int pageSize);

    /**
     * 删除种子
     * @param torrentId 要删除的种子的 id
     * @return 删除操作是否成功
     */
    boolean deleteTorrentById(Long torrentId);

    /**
     * 获取某个用户所有上传的种子列表
     * @param userId 用户 ID
     * @return 该用户上传的种子列表
     */
    PagedGridResult getUploadedTorrentsByUserId(String userId, int page, int pageSize);

    /**
     * 修改种子促销策略
     * @param torrentId 种子 ID
     * @param promotionPolicySlug 促销策略 slug
     * @return 修改操作是否成功
     */
    boolean updateTorrentPromotionPolicy(Long torrentId, String promotionPolicySlug);


    /**
     * 应用种子的上传促销策略计算上传偏移量
     * @param torrent 种子对象
     * @param promotionUploadOffset 初始上传偏移量
     * @return 应用策略后的上传偏移量
     */
    public long applyTorrentPromotionUploadOffset(Torrent torrent, long promotionUploadOffset);

    /**
     * 应用种子的下载促销策略计算下载偏移量
     * @param torrent 种子对象
     * @param promotionDownloadOffset 初始下载偏移量
     * @return 应用策略后的下载偏移量
     */
    public long applyTorrentPromotionDownloadOffset(Torrent torrent, long promotionDownloadOffset);

    /**
     * 使用 Mahout 进行种子推荐
     * @param userId 用户 ID
     * @return 推荐的种子列表
     */
    List<TorrentListVO> recommendTorrentsByMahout(String userId) throws TasteException;


    /**
     * @Description 更新种子状态
     * @Author hp
     * @return null
     */
    public void updateTorrentStatus(Long torrentId);

    /**
     * @Description 判断种子是否存活
     * @Author hp
     * @param torrentId
     * @return boolean
     */
    public boolean isTorrentAlive(Long torrentId);
}